#include "RangoHorario.h"

using namespace modelo;

RangoHorario::RangoHorario(Hora horaDesde, Hora horaHasta)
{
	this->horaDesde = horaDesde;
	this->horaHasta = horaHasta;
};

// (b1 >= I AND b1 < II) OR (b1 < I AND b2 > I)
bool RangoHorario::SePisan(RangoHorario* otroRango)
{
	bool cumplePrimerTermino = (this->HoraEsMayorOIgualA(otroRango->GetHoraDesde(), this->GetHoraDesde()) 
		&& this->HoraEsMenorA(otroRango->GetHoraDesde(), this->GetHoraHasta()));
	
	bool cumpleSegundoTermino = (this->HoraEsMenorA(otroRango->GetHoraDesde(), this->GetHoraDesde())
		&& this->HoraEsMayorA(otroRango->GetHoraHasta(), this->GetHoraDesde()));

	return cumplePrimerTermino || cumpleSegundoTermino;
};

// b1 >= I AND b2 <= II
bool RangoHorario::Contiene(RangoHorario* otroRango)
{
	return this->HoraEsMayorOIgualA(otroRango->GetHoraDesde(), this->GetHoraDesde()) &&
		this->HoraEsMenorOIgualA(otroRango->GetHoraHasta(), this->GetHoraHasta());
};

bool RangoHorario::HoraEsMayorA(Hora unaHora, Hora otraHora)
{
	return (unaHora.horas > otraHora.horas) || 
		(unaHora.horas == otraHora.horas && unaHora.minutos > otraHora.minutos);
};

bool RangoHorario::HoraEsMayorOIgualA(Hora unaHora, Hora otraHora)
{
	return (unaHora.horas > otraHora.horas) || 
		(unaHora.horas == otraHora.horas && unaHora.minutos >= otraHora.minutos);
};

bool RangoHorario::HoraEsMenorA(Hora unaHora, Hora otraHora)
{
	return (unaHora.horas < otraHora.horas) || 
		(unaHora.horas == otraHora.horas && unaHora.minutos < otraHora.minutos);
};

bool RangoHorario::HoraEsMenorOIgualA(Hora unaHora, Hora otraHora)
{
	return (unaHora.horas < otraHora.horas) || 
		(unaHora.horas == otraHora.horas && unaHora.minutos <= otraHora.minutos);
};